package org.jeecg.modules.demo.Kingdee.bank.entity.settlement;

import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.math.BigDecimal;

/**
 * 单笔付款请求实体 (SKDLTTRN)
 * 参数名严格按照接口文档定义，确保与银行接口字段完全一致
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class SinglePaymentRequest {
    
    /**
     * 接口请求代码
     */
    private String action = "SKDLTTRN";
    
    /**
     * 银企直联用户名
     */
    private String userName;
    
    /**
     * 外部请求流水号
     * 最大长度为50，不能重复
     */
    private String externalNum;
    
    /**
     * 联动支付
     * 00：否，01:是 默认为否
     */
    private String linkPayFlag = "00";
    
    /**
     * 付方账号
     * 允许输入0-9a-zA-Z空格-?:().,'+/ 字符，空格不能为首尾字符，不能全为特殊字符，至少一个数字，最大长度为32
     */
    private String pypartyAccnum;
    
    /**
     * 收方账号
     * 允许输入0-9a-zA-Z空格-?:().,'+/ 字符，空格不能为首尾字符，不能全为特殊字符，至少一个数字，最大长度为32
     */
    private String rcvpyAccnum;
    
    /**
     * 收方户名
     * 最大支持长度300（每汉字/占3长度；每非汉字/占1长度）
     */
    private String rcvpyAccnm;
    
    /**
     * 是否准确校验开户行行名
     * 00:是 01：否 默认为是
     */
    private String isCheckRcvpartyDepbnkId = "00";
    
    /**
     * 收方开户行
     * 收方开户行和收方联行号选择一个输入即可
     */
    private String rcvpartyDepbnkId;
    
    /**
     * 收方联行号
     */
    private String rcvpartyBnkgId;
    
    /**
     * 是否保存收方信息
     * 00为否，01为是。默认为否
     */
    private String isSaveRcvInfo = "00";
    
    /**
     * 交易对手类型
     * 客户:01供应商:02 经销商:03其他:04
     */
    private String txnCntprTp;
    
    /**
     * 付款种类
     * 00：对公 01：对私
     */
    private String pyAccTp;
    
    /**
     * 付款金额
     * 整数最长13位，2位小数 - 使用BigDecimal确保精度
     */
    private BigDecimal amt;
    
    /**
     * 币种
     * 币种仅支持人民币（CNY）
     */
    private String currencyID = "CNY";
    
    /**
     * 是否跨行
     * 00：不跨行 01：跨行
     */
    private String isInterbnk;
    
    /**
     * 加急审批
     * 00：否，01:是 默认为否
     */
    private String urgntAprvFlag = "00";
    
    /**
     * 预约付款
     * 00：否 01:是 默认为否
     */
    private String pyTmlnsFlag = "00";
    
    /**
     * 预约时间
     * 预约付款状态为01时，预约时间必填
     * 年月日格式为 yyyy-MM-dd 时分格式为枚举值 06:00-22:00任一时间
     */
    private String rsrvtnTms;
    
    /**
     * 附言
     * 银行附言，最大支持长度300（每汉字占3长度；每非汉字占1长度）
     */
    private String pscpt;
    
    /**
     * 备注
     * 最大长度为40
     */
    private String rmrk;
    
    /**
     * 备用字段1
     * 最大长度为200
     */
    private String rmrk1;
    
    /**
     * 备用字段2
     * 最大长度为200
     */
    private String rmrk2;
    
    /**
     * 备用字段3
     * 最大长度为200
     */
    private String rmrk3;
    
    /**
     * 备用字段4
     * 最大长度为200
     */
    private String rmrk4;
    
    // ========== 向下兼容的getter方法 ==========
    // 为了保持向下兼容，提供原有字段名的getter方法
    
    @JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
    public String getExtOrdNo() {
        return this.externalNum;
    }
    
    public void setExtOrdNo(String extOrdNo) {
        this.externalNum = extOrdNo;
    }
    
    @JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
    public String getPyAccNo() {
        return this.pypartyAccnum;
    }
    
    public void setPyAccNo(String pyAccNo) {
        this.pypartyAccnum = pyAccNo;
    }
    
    @JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
    public String getRcvAccNo() {
        return this.rcvpyAccnum;
    }
    
    public void setRcvAccNo(String rcvAccNo) {
        this.rcvpyAccnum = rcvAccNo;
    }
    
    @JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
    public String getRcvAccNm() {
        return this.rcvpyAccnm;
    }
    
    public void setRcvAccNm(String rcvAccNm) {
        this.rcvpyAccnm = rcvAccNm;
    }
    
    @JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
    public String getRcvAccBnk() {
        return this.rcvpartyDepbnkId;
    }
    
    public void setRcvAccBnk(String rcvAccBnk) {
        this.rcvpartyDepbnkId = rcvAccBnk;
    }
    
    @JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
    public String getRcvBnkNo() {
        return this.rcvpartyBnkgId;
    }
    
    public void setRcvBnkNo(String rcvBnkNo) {
        this.rcvpartyBnkgId = rcvBnkNo;
    }
    
    @JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
    public String getMemo() {
        return this.pscpt;
    }
    
    public void setMemo(String memo) {
        this.pscpt = memo;
    }
    
    @JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
    public String getPurpose() {
        return this.rmrk;
    }
    
    public void setPurpose(String purpose) {
        this.rmrk = purpose;
    }
    
    @JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
    public String getCcy() {
        return this.currencyID;
    }
    
    public void setCcy(String ccy) {
        this.currencyID = ccy;
    }
    
    // 金额转换方法 - 兼容原有Long类型(分)到BigDecimal(元)
    @JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
    public Long getPyAmt() {
        return this.amt != null ? this.amt.multiply(new BigDecimal("100")).longValue() : null;
    }
    
    public void setPyAmt(Long pyAmt) {
        this.amt = pyAmt != null ? new BigDecimal(pyAmt).divide(new BigDecimal("100")) : null;
    }
}